from datetime import date

from commons.entity.po.user import User
from commons.entity.query.user_query import UserQuery
from commons.entity.vo.user_vo import UserVO
from commons.exception.business_exception import BusinessException
from commons.utils.copy_tools import CopyTools
from user_service.user.mappers.user_mapper import UserMapper


class UserService:
    def __init__(self):
        self.user_mapper = UserMapper()

    def test(self):
        # 使用对象作为过滤参数
        user_query = UserQuery(position="员工")  # 这几种赋值方法都可以
        user_query.sex = "男"  # 这几种赋值方法都可以

        # 调用查询方法
        users = self.user_mapper.select_count(User, user_query)

        # 输出查询结果
        print(users)

        users = self.user_mapper.select_list(User, user_query)
        print(users)

        print(self.get_user_by_user_id("U001"))

        user_id = "U001"
        user_bean = User()
        user_bean.sex = "male"  # 这几种赋值方法都可以
        self.update_user_by_user_id(user_bean, user_id)

        user_bean = User(user_id="U049", birthday="2000-01-01", email="user@qq.com", name="优五十一",
                         password="password123", phone="13800138048", position="员工", sex="男")  # 这几种赋值方法都可以
        self.user_mapper.insert_or_update(user_bean)

    def find_list_by_param(self, user_query=None):
        """
        业务逻辑：根据多个参数查询用户列表。
        :param user_query: UserQuery 实例，包含查询过滤条件。
        :return: 包含用户信息字典的列表。
        """
        print("UserService find_list_by_param")
        print(user_query)

        return self.user_mapper.select_list(User, user_query)

    def find_count_by_param(self, user_query=None):
        """
        业务逻辑：根据多个参数统计用户数量。
        :param user_query: UserQuery 实例，包含查询过滤条件。
        :return: 符合条件的用户数量。
        """
        print("UserService find_count_by_param")
        print(user_query)

        return self.user_mapper.select_count(User, user_query)

    def get_user_by_user_id(self, user_id):
        """
        业务逻辑：获取用户信息
        :param user_id: str
        :return: 用户信息字典或 None
        """
        print("UserService get_user_by_id ")
        print(user_id)

        return self.user_mapper.select_by_user_id(user_id)

    def add(self, user_bean):
        """
        业务逻辑：添加一个新的用户。
        :param user_bean: User 类实例，包含用户信息。
        :return: 插入操作是否成功（True/False）。
        """
        print("UserService add user")
        print(user_bean)

        return self.user_mapper.insert(user_bean)

    def add_batch(self, user_list_bean):
        """
        业务逻辑：批量添加用户。
        :param user_list_bean: 包含多个 User 类实例的列表，包含需要插入的用户信息。
        :return: 插入操作成功的用户数量。
        """
        print("UserService add_batch users")
        print(user_list_bean)

        if not user_list_bean:
            print("No users to add. The input list is either null or empty.")
            return 0

        return self.user_mapper.insert_batch(user_list_bean)

    def add_or_update_batch(self, user_list_bean):
        """
        业务逻辑：批量插入或更新用户信息。
        :param user_list_bean: 包含多个 User 类实例的列表，包含需要插入或更新的用户信息。
        :return: 插入或更新成功的用户数量。
        """
        print("UserService add_or_update_batch users")
        print(user_list_bean)

        if not user_list_bean:
            print("No users to add. The input list is either null or empty.")
            return 0

        return self.user_mapper.insert_or_update_batch(User, user_list_bean)

    def update_by_param(self, user_bean, user_query):
        """
        业务逻辑：根据多个条件更新用户信息。
        :param user_bean: User 类实例或字典，包含需要更新的字段及其新值。
        :param user_query: UserQuery 类实例或字典，包含用于定位记录的过滤条件。
        :return: 更新成功的数量。
        """
        print("UserService update_by_param")
        print(user_bean)
        print(user_query)

        return self.user_mapper.update_by_params(User, user_bean, user_query)

    def delete_by_param(self, user_query):
        """
        业务逻辑：根据多个条件删除用户信息。
        :param user_query: UserQuery 类实例或字典，包含用于定位记录的过滤条件。
        :return: 删除成功的数量。
        """
        print("UserService delete_by_param")
        print(user_query)

        return self.user_mapper.delete_by_param(User, user_query)

    def update_user_by_user_id(self, user_bean, user_id):
        """
        业务逻辑：根据 user_id 更新用户信息
        :param user_id: str
        :param user_bean: User 类实例，包含需要更新的用户属性
        :return: 更新成功信息或错误信息
        """
        print("UserService update_user_by_id ")
        print(f"user_id: {user_id}, user_bean: {user_bean}")

        return self.user_mapper.update_by_user_id(user_bean, user_id)

    def delete_user_by_user_id(self, user_id):
        """
        业务逻辑：根据 user_id 删除用户
        :param user_id: str
        :return: 删除成功或错误
        """
        print("UserService delete_user_by_id ")
        print(user_id)

        return self.user_mapper.delete_by_user_id(user_id)

    def login(self, position, user_id, password):
        """
        用户登录业务逻辑，根据用户ID、职位和密码进行身份验证。

        1. 根据用户ID查询用户信息。
        2. 如果用户不存在，抛出业务异常。
        3. 如果职位不匹配，抛出业务异常。
        4. 如果密码不正确，抛出业务异常。
        5. 如果所有验证通过，返回包含用户信息的 UserVO。
        6. 计算用户年龄，并将其设置到 UserVO 中。

        :param position: 用户的职位，用于验证用户职位是否正确。
        :param user_id: 用户的唯一标识，用于查找用户信息。
        :param password: 用户输入的密码，用于验证用户身份。

        :return: 返回一个 `UserVO` 实例，包含用户的信息（如 ID、姓名、职位、年龄等）。

        :raises BusinessException: 如果用户不存在、职位不匹配或密码错误，将抛出相应的业务异常。
        """
        print("UserService login")
        print(position)
        print(user_id)
        print(password)

        user = self.user_mapper.select_by_user_id(user_id)

        if user is None:
            raise BusinessException("用户不存在")

        if position != user.position:
            raise BusinessException("职位错误")

        if password != user.password:
            raise BusinessException("密码错误")

        user_vo = CopyTools.copy(user, UserVO)

        # 计算年龄
        birth_date = user.birthday
        current_date = date.today()
        age = current_date.year - birth_date.year - (
                (current_date.month, current_date.day) < (birth_date.month, birth_date.day))
        user_vo.age = str(age)

        return user_vo

    def get_all_users_by_id_list(self, user_id_list):
        """
        业务逻辑：根据用户ID列表获取多个用户信息。
        :param user_id_list: 包含多个用户ID的列表。
        :return: 包含多个用户信息的列表。
        """
        print("UserService get_all_users_by_id_list")
        print(user_id_list)

        if not user_id_list:
            return []

        users = []
        for user_id in user_id_list:
            user = self.user_mapper.select_by_user_id(user_id)
            if user:
                users.append(user)

        return users
